iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

今天是第十七天我們可以寫一個Lstm預測房價系統,以下是程式碼

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# 讀取數據
data = pd.read_csv('house_prices.csv')
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)

# 只使用價格進行預測
price_data = data['Price'].values
price_data = price_data.reshape(-1, 1)

# 標準化數據
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(price_data)

# 創建訓練數據集
def create_dataset(dataset, time_step=1):
    X, Y = [], []
    for i in range(len(dataset)-time_step-1):
        X.append(dataset[i:(i+time_step), 0])
        Y.append(dataset[i + time_step, 0])
    return np.array(X), np.array(Y)

time_step = 10  # 使用前10個時間點來預測下一個時間點
X, Y = create_dataset(scaled_data, time_step)

# 重塑數據為 [samples, time steps, features]
X = X.reshape(X.shape[0], X.shape[1], 1)

# 建立 LSTM 模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))

# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')

# 訓練模型
model.fit(X, Y, epochs=100, batch_size=32)

# 預測下一個時間點的房價
last_10_days = scaled_data[-time_step:]
last_10_days = last_10_days.reshape(1, time_step, 1)

predicted_price = model.predict(last_10_days)
predicted_price = scaler.inverse_transform(predicted_price)

print(f"預測的下一個時間點的房價: {predicted_price[0][0]}")

# 繪製預測結果
train = data[:len(data)-time_step]
valid = data[len(data)-time_step:]
valid['Predictions'] = predicted_price

plt.figure(figsize=(16,8))
plt.title('LSTM 模型預測房價')
plt.xlabel('日期', fontsize=18)
plt.ylabel('價格', fontsize=18)
plt.plot(train['Price'])
plt.plot(valid[['Price', 'Predictions']])
plt.legend(['訓練數據', '真實價格', '預測價格'], loc='lower right')
plt.show()

1. 匯入必要的庫

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
  • pandas:用來讀取和處理數據。
  • numpy:用來進行數值計算,特別是在處理陣列時非常有用。
  • matplotlib:用來繪製圖表,視覺化結果。
  • MinMaxScaler:用來標準化數據(將數據縮放到 0 到 1 之間)。
  • Sequential, Dense, LSTM:來自 Keras 庫,用於構建和訓練神經網路模型。

2. 讀取數據並進行預處理

data = pd.read_csv('house_prices.csv')
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
  • data:從 CSV 文件讀取數據。這裡假設 CSV 文件有兩列:DatePrice
  • pd.to_datetime:將日期列轉換為 pandas 的日期時間格式。
  • set_index:將日期設為索引,以方便處理時間序列數據。

3. 標準化數據

price_data = data['Price'].values
price_data = price_data.reshape(-1, 1)

scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(price_data)
  • price_data:提取價格數據並將其轉換為 NumPy 陣列。
  • reshape:將數據轉換為形狀為 (n, 1) 的 2D 陣列,以符合後續操作需求。
  • MinMaxScaler:將價格數據標準化到 0 到 1 之間,這有助於加快模型的收斂速度並提高預測精度。

4. 創建訓練數據集

def create_dataset(dataset, time_step=1):
    X, Y = [], []
    for i in range(len(dataset)-time_step-1):
        X.append(dataset[i:(i+time_step), 0])
        Y.append(dataset[i + time_step, 0])
    return np.array(X), np.array(Y)
  • create_dataset:這個函數用來創建訓練數據集,X 是輸入特徵,Y 是標籤(即預測值)。
    • X:包含前 time_step 個時間點的價格數據。
    • Y:對應於 X 之後的下一個時間點的價格,即我們要預測的目標值。

5. 生成輸入和輸出數據

time_step = 10  # 使用前10個時間點來預測下一個時間點
X, Y = create_dataset(scaled_data, time_step)

X = X.reshape(X.shape[0], X.shape[1], 1)
  • time_step:這個變量表示我們會使用前 10 個時間點的數據來預測下一個時間點的房價。
  • X, Y:使用 create_dataset 函數生成輸入特徵和標籤。
  • reshape:LSTM 層要求輸入數據的形狀為 [samples, time steps, features],所以我們將 X 轉換為這種格式。

6. 建立 LSTM 模型

model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
  • Sequential:表示我們的模型是順序模型,也就是每層按順序堆疊。
  • LSTM(50, return_sequences=True):第一個 LSTM 層有 50 個神經元,並將其輸出序列傳遞給下一層。
  • LSTM(50, return_sequences=False):第二個 LSTM 層也有 50 個神經元,但這次它只返回最後一個時間步的輸出(因為 return_sequences=False)。
  • Dense(25):這是一個全連接層,包含 25 個神經元,用來進一步處理 LSTM 的輸出。
  • Dense(1):最後一層輸出一個值,這就是我們預測的房價。

7. 編譯並訓練模型

model.compile(optimizer='adam', loss='mean_squared_error')

model.fit(X, Y, epochs=100, batch_size=32)
  • compile:我們使用 adam 優化器並採用均方誤差(MSE)作為損失函數來編譯模型。
  • fit:開始訓練模型,使用 100 個訓練迭代(epochs),每次訓練批次大小為 32。

8. 預測房價

last_10_days = scaled_data[-time_step:]
last_10_days = last_10_days.reshape(1, time_step, 1)

predicted_price = model.predict(last_10_days)
predicted_price = scaler.inverse_transform(predicted_price)

print(f"預測的下一個時間點的房價: {predicted_price[0][0]}")
  • last_10_days:我們提取最近的 10 天數據,這將作為模型的輸入來預測下一個時間點的房價。
  • reshape:重塑數據以符合 LSTM 層的輸入要求。
  • model.predict:使用訓練好的模型來預測下一個時間點的房價。
  • scaler.inverse_transform:將標準化後的預測值轉換回原始的價格範圍。

9. 結果可視化

train = data[:len(data)-time_step]
valid = data[len(data)-time_step:]
valid['Predictions'] = predicted_price

plt.figure(figsize=(16,8))
plt.title('LSTM 模型預測房價')
plt.xlabel('日期', fontsize=18)
plt.ylabel('價格', fontsize=18)
plt.plot(train['Price'])
plt.plot(valid[['Price', 'Predictions']])
plt.legend(['訓練數據', '真實價格', '預測價格'], loc='lower right')
plt.show()
  • train:定義訓練集部分的數據。
  • valid:定義驗證集部分的數據,同時將預測的價格添加到這個 DataFrame 中。
  • plt.plot:繪製訓練數據、真實價格和預測價格的圖表,以可視化比較結果。

10. 總結

這個程式碼展示了一個基於 LSTM 的時間序列預測模型,從數據的預處理到模型的構建、訓練以及最終的預測和可視化。通過這個模型,我可以根據歷史房價數據來預測未來的房價。我可以根據你的實際需求對模型進行調整,例如修改 time_step 的大小,添加更多的 LSTM 層,或調整模型的超參數以獲得更好的預測效果。


上一篇
day 16 Lstm結合yolo多斑馬魚相互影響行為分析
下一篇
day 18 利用yolo結合AI辨識動物情緒
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言